﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading;
using CopyFileForUgpa;
using HashCode;
using XML;

namespace Updater
{
	public class Program
	{
		public static void Main(string[] args)
		{
			var settings = new UpdaterSettings();
			Process[] processes = Process.GetProcessesByName(settings.ProcessFinish);

			foreach (Process process in processes)
			{
				process.Kill();
			}

			Console.WriteLine("Настройки получены");
			Console.WriteLine("Путь к исходной папке: {0}", settings.Source);
			Console.WriteLine("Путь к конечной папке: {0}", settings.Target);
			Console.WriteLine("Полное совпадение: {0}", settings.FullMatchDirectories);
			Console.WriteLine("Путь к файлу с информацией о файлах в релизе: {0}", settings.PathToXmlFileWithFileInfoAboutFileInReleas);
			Console.WriteLine();
			bool succ = false;
			try
			{
				Console.WriteLine("Получение данных");
				var sourceFolder = new ReceptionInformationAboutFolder(settings.Source);
				string directoryForLogs = Path.Combine(Environment.CurrentDirectory, "Logs");

				if (!Directory.Exists(directoryForLogs))
				{
					Directory.CreateDirectory(directoryForLogs);
				}

				string pathToXmlFileWithInformationForCopy = sourceFolder.GetXmlOfListOfFileForCopy(settings.Target, directoryForLogs);
				List<InformationAboutFile> forCopy = ForXmlFiles.ReadXmlDocument(pathToXmlFileWithInformationForCopy, settings.Source);
				using (var copyHandler = new CopyFile(settings.Source, settings.Target, settings.ExcludeFiles, settings.PureFolders, settings.ExcludeFolders, forCopy, settings.FullMatchDirectories, settings.PathToXmlFileWithFileInfoAboutFileInReleas))
				{
					Console.WriteLine("Обновление начато");
					copyHandler.Copy((int i, string nameFile, string dirName, long num) => { }, null);
					int allFilesInSource = sourceFolder.AboutFileInSourceDir.Count;
					if (copyHandler.CountOfCopedFiles == 0)
					{
						succ = true;
						Console.WriteLine("Обновление не требуется");
						Thread.Sleep(1000);
					}
					else
					{
						Console.WriteLine("Успешно");
						Console.WriteLine("Скопировано файлов {0}", copyHandler.CountOfCopedFiles);
						Console.WriteLine("Файлов всего в исходной папке {0}", sourceFolder.NumberOfFiles);
						succ = true;
						Thread.Sleep(1000);
					}
				}
			}
			catch (CopyFileException ex)
			{
				if (ex.Error == CopyFileException.ErrorType.ChackSumError)
				{
					Console.WriteLine("Ошибка контрольных сумм в файле. {0}", ex.FileInfo.FullName);
				}
				else
				{
					Console.WriteLine("Не удалось получить доступ на запись файла. {0}", ex.FileInfo.FullName);
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine("Неуспешно\n Причина: {0}", ex.Message);
			}
			finally
			{
				if (settings.ApplicationStart != string.Empty && succ)
                {
                    if (File.Exists(settings.ApplicationStart))
                    {
                        Process.Start(settings.ApplicationStart, "new");
                    }
                }
				else
				{
					Console.ReadLine();
				}
			}
		}
	}
}
